unit CalculosClassificacao;

{$mode objfpc}{$H+}

interface


uses
  Classes, SysUtils, Dialogs;

type
  {TComponentes}
  /// Registro para armazenar os componentes do solo
  TComponentes = record
    argila, silte, areia: real;
  end;

  {TDadosAmostra}
  /// Registro para armazenar os dados de uma amostra
  TDadosAmostra = record
    peso_volume_pipetado_1, peso_becker_1,
    peso_volume_pipetado_2, peso_becker_2: integer
  end;

/// Obtém as porcentagens do cada componente do solo a partir dos dados da amostra
/// @param(Pesos contém os dados da amostra)
/// @return(As porcentagens de cada componente do solo)
function Porcentagens(Pesos: TDadosAmostra): TComponentes;
/// Obtém a classificação do solo a partir de seus componentes
/// @param(Valores cotém as porcentagens de cada componente do solo)
/// @return(A classificação do solo)
function Classificacao(Valores: TComponentes): string;

implementation

function Porcentagens(Pesos: TDadosAmostra): TComponentes;
var
  // Argila + Silte
  argila_silte: real;
  // Resultado do cálculo
  resultado: TComponentes;
begin
  // Obtém a quantidade de argila + silte
  argila_silte := ((Pesos.peso_volume_pipetado_1 - Pesos.peso_becker_1) / 10);
  // Obtém a quantidade de argila
  resultado.argila := ((Pesos.peso_volume_pipetado_2 - Pesos.peso_becker_2) / 10);
  // Obtém a quantidade de silte
  resultado.silte := (argila_silte - resultado.argila);
  // Obtém a quantidade de areia
  resultado.areia := 100 - (resultado.argila + resultado.silte);
  // Retorna o resultado
  Porcentagens := resultado;
end;

function Classificacao(Valores: TComponentes): string;
var
  resultadoClassificacao: string;
begin
  if (Valores.argila > 60) then begin
    resultadoClassificacao := ('MUITO ARGILOSO');
  end else begin
    if (Valores.argila > 35) then begin
      resultadoClassificacao := ('ARGILOSO');
    end else begin
      if (Valores.areia < 15) then begin
        resultadoClassificacao := ('SILTOSO');
      end else begin
        if ((Valores.areia - Valores.argila) < 70) then begin
          resultadoClassificacao := ('TEXTURA MÉDIA');
        end else begin
          resultadoClassificacao := ('ARENOSO');
        end;
      end;
    end;
  end;
  Classificacao := resultadoClassificacao;
end;

end.
